using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FiltronASP.Logger;

namespace FiltronASP.Models.DAO
{
    /// <summary>
    /// Klasa dla operacji bazodanowych specyficznych dla tabeli <code>users</code>.
    /// </summary>
    public class UserDAO : Abstracts.AbstractGenericDAO<User, System.Nullable<int>>,
        Interfaces.IUserDAO
    {
        /// <summary>
        /// Metoda zwracajaca nazwe parametru bedacego kluczem glownym tabeli.
        /// </summary>
        /// <returns>nazwa klucza glownego</returns>
        protected override string GetKeyProperty()
        {
            return "user_id";
        }

        /// <summary>
        /// Pobieranie obiektu na podstawie loginu użytkownika.
        /// </summary>
        /// <param name="userLogin">login użytkownika</param>
        /// <returns>Lista rekordów o zadanym loginie użytkownika</returns>
        public User FindByUserLogin(String userLogin)
        {
            if (String.IsNullOrEmpty(userLogin))
            {
                return null;
            }   //if
            try
            {
                return this._cmsEntitiesDataContext.Users.SingleOrDefault(
                    user => user.user_login.Equals(userLogin)
                );
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy aktywnych/nieaktywnych użytkowników.
        /// </summary>
        /// <param name="userActive">aktywny</param>
        /// <returns>lista rekordow aktywnych/nieaktywnych użytkowników</returns>
        public IQueryable<User> FindActiveUsers(bool userActive)
        {

            try
            {
                IQueryable<User> users = this._cmsEntitiesDataContext.Users.Where(
                    user => user.user_active.Equals(userActive)
                        );

                if (!(users.Any()))
                {
                    return null;
                }   //if
                return users;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie nazwy i którzy nie będą zadanym użytkownikiem.
        /// </summary>
        /// <param name="userName">nazwa</param>
        /// <param name="userId">użytkownik</param>
        /// <returns>lista rekordow o zadanej nazwie użytkownika i nie będące zadanym użytkownikiem</returns>
        public IQueryable<User> FindByUserNameAndNotUserId(string userName, int userId)
        {
            if (String.IsNullOrEmpty(userName) || userId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<User> users = this._cmsEntitiesDataContext.Users.Where(
                    user => user.user_last_name.ToLower().Equals(userName) &&
                        !user.user_id.Equals(userId)
                        );

                if (!(users.Any()))
                {
                    return null;
                }   //if
                return users;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie najwyższego id użytkownika.
        /// </summary>
        /// <returns>Najwyższy id użytkownika</returns>
        public int SelectMaxUserId()
        {
            try
            {

                int max = this._cmsEntitiesDataContext.Users.Max(us => us.user_id);
                return max;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return -1;
        }
    }
}
